home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / WINDOWS / TVCACHE.ZIP / COMPASM.ASM next >
Encoding:
Assembly Source File  |  1996-01-06  |  6.3 KB  |  311 lines

  1. ;======================================================================
  2. ; COMPASM.asm    
  3. ;
  4. ; Copyright (c) 1995 Mark Russinovich and Bryce Cogswell    
  5. ;
  6. ; This code is free to use and modify in whatever manner you wish.
  7. ;
  8. ; Highly optimized assembly language compress/decompress
  9. ; for use when running vxd.
  10. ; NOTE: in the mask byte, a 0 indicates a hit, while a 1 is a mis
  11. ; prediction.
  12. ;
  13. ;======================================================================
  14. .386p
  15.     NO_SEGMENTS=1
  16.     include vmm.inc
  17.     include vsegment.inc
  18. .list
  19.  
  20. VXD_LOCKED_DATA_SEG
  21.  
  22. ; prediction table 
  23. ApcTable    db    1000h dup(0)
  24.  
  25. VXD_LOCKED_DATA_ENDS
  26.  
  27. VXD_LOCKED_CODE_SEG
  28.  
  29. ;----------------------------------------------------------------------
  30. ;
  31. ; DecompressByte
  32. ;
  33. ; Macro for decompressing.
  34. ;
  35. ; Register usage:
  36. ;    EBX:    previous two bytes
  37. ;    DL:    hit mask
  38. ;    ESI:    current source pointer
  39. ;    EDI:    current destination pointer
  40. ;
  41. ;----------------------------------------------------------------------
  42. DecompressByte    MACRO    
  43.         LOCAL    hit, miss 
  44.  
  45.         shl    dl, 1
  46.         jnc    hit            ; was it a hit
  47.         lodsb    
  48.         mov    ApcTable[ebx], al    ; no, update pred table
  49.         jmp    miss
  50. hit:        mov    al, ApcTable[ebx]    ; get predicted value
  51. miss:        shl    bx, 6            ; create new pred value
  52.         xor    bl, al
  53.         and    bh, 0Fh
  54.         mov    [edi], al        ; place in output buffer
  55.         inc    edi
  56.         ENDM
  57.  
  58.     
  59. ;----------------------------------------------------------------------
  60. ;
  61. ; Decompress
  62. ;
  63. ; Interfaces with C code to provide super-optimized decompression
  64. ; algorithm. Based highly on original FIN Dr. Dobb's decompression
  65. ; algorithm. 
  66. ;
  67. ;----------------------------------------------------------------------
  68. Public ADecompress
  69. ADecompress PROC C USES ebx ecx edx esi edi,
  70.     inbuf_orig:    DWORD,
  71.     outbuf_len:    DWORD,
  72.     outbuf_orig:    DWORD,
  73.     init:        BYTE
  74.  
  75.     ; is it a zero-len buffer?
  76.  
  77.     cld
  78.     xor    eax, eax
  79.     cmp    outbuf_len, 0
  80.     je    dcexit
  81.  
  82.     ; zero prediction table
  83.  
  84.     cmp    init, 0
  85.     je    dcnoclear
  86.     mov    ecx, 1000h        ; 4K bytes
  87.     shr    ecx, 2            ; 4 bytes cleared each loop
  88.     mov    edi, offset ApcTable
  89.     xor    eax, eax
  90.     rep    stosd    
  91.     xor    ebx, ebx        ; initialize prediction value
  92.     jmp    dcinitparams
  93.  
  94. dcnoclear:
  95.     xor    ebx, ebx
  96.     mov    edx, inbuf_orig
  97.     mov    bl, [edx-3]        ; setup prediction value
  98.     shl     bx, 6
  99.     xor    bl, [edx-2]
  100.     shl    bx, 6
  101.     xor    bl, [edx-1]
  102.     and    bh, 0Fh
  103.  
  104.     ; set up parameters
  105.     
  106. dcinitparams:
  107.     mov    esi, inbuf_orig
  108.     mov    edi, outbuf_orig
  109.     mov    ecx, outbuf_len
  110.     shr    ecx, 3            ; do 8 byte blocks
  111.  
  112.     ; enter main loop
  113.  
  114. DecompressBlock:
  115.     lodsb                ; get mask byte
  116.     mov    dl, al
  117.     DecompressByte    
  118.     DecompressByte    
  119.     DecompressByte
  120.     DecompressByte    
  121.     DecompressByte    
  122.     DecompressByte    
  123.     DecompressByte    
  124.     DecompressByte    
  125.     dec    ecx
  126.     jnz    DecompressBlock
  127.  
  128.     ; return the amount decompressed
  129.  
  130.     sub    esi, inbuf_orig
  131.     mov    eax, esi
  132. dcexit:
  133.     ret
  134.  
  135. ADecompress ENDP
  136.  
  137.  
  138. ;----------------------------------------------------------------------
  139. ;
  140. ; CompressByte
  141. ;
  142. ; This is a macro for processing the current byte on compression.
  143. ;
  144. ; Register usage:
  145. ;    EBX:     previous two bytes
  146. ;    DL:     accumulated hit mask
  147. ;    ESI:    current source pointer
  148. ;    EDI:    current destination pointer
  149. ;
  150. ;----------------------------------------------------------------------
  151. CompressByte    MACRO    curbyte:REQ, bitval: REQ
  152.         LOCAL    hit
  153.  
  154.         cmp    curbyte, ApcTable[ebx]    ; is it a correct prediction?
  155.         je    hit            ; yep
  156.         or    dl, bitval        ; no, so update table
  157.         mov    ApcTable[ebx], curbyte    ; update prediction table
  158.         mov    [edi], curbyte        ; copy to destination
  159.         inc    edi            ; increment dest pointer
  160. hit:        shl    bx, 6            ; create new pred value
  161.         xor    bl, curbyte
  162.         and    bh, 0Fh
  163.         ENDM
  164.  
  165.  
  166. ;----------------------------------------------------------------------
  167. ;
  168. ; Compress
  169. ;
  170. ; Interfaces with C code to provide super-optimized compression
  171. ; algorithm. Based highly on original FIN Dr. Dobb's compression
  172. ; algorithm. 
  173. ;
  174. ;----------------------------------------------------------------------
  175. Public ACompress
  176. ACompress PROC C USES ebx ecx edx esi edi,
  177.     inbuf:         DWORD,
  178.     inbuf_len:     DWORD,
  179.     outbuf_orig:    DWORD,
  180.     init:        BYTE
  181.  
  182.     ; is it a zero-len buffer?
  183.  
  184.     cld
  185.     xor    eax, eax
  186.     cmp    inbuf_len, 0
  187.     je    cexit
  188.  
  189.     ; first, zero prediction table
  190.  
  191.     cmp    init, 0
  192.     jz    cnoclear
  193.     mov    ecx, 1000h        ; 4K byte table
  194.     shr    ecx, 2            ; 4 bytes cleared each loop
  195.     mov    edi, offset ApcTable
  196.     xor    eax, eax
  197.     rep    stosd
  198.     xor    ebx, ebx        ; initialize prediction value
  199.     jmp    cinitparams
  200.     
  201. cnoclear:
  202.     xor    ebx, ebx
  203.     mov    edx, inbuf
  204.     mov    bl, [edx-3]        ; set-up prediction value
  205.     shl    bx, 6
  206.     xor    bl, [edx-2]
  207.     shl    bx, 6
  208.     xor    bl, [edx-1]
  209.     and    bh, 0Fh
  210.     
  211.     ; set up parameters
  212.  
  213. cinitparams:
  214.     mov    esi, inbuf
  215.     mov    edi, outbuf_orig
  216.     mov    ecx, inbuf_len
  217.     shr    ecx, 5            ; divide by 8 for 8 byte blocks
  218.     push    ebp
  219.  
  220.     ; enter the main loop
  221.     
  222. CompressBlock:
  223.  
  224.     mov    ebp, edi        ; save location of mask byte
  225.     inc    edi            ; skip over mask byte
  226.     xor    dl, dl            ; zero bit mask
  227.     lodsw
  228.     CompressByte al, 80h
  229.     CompressByte ah, 40h
  230.     lodsw
  231.     CompressByte al, 20h
  232.     CompressByte ah, 10h
  233.     lodsw
  234.     CompressByte al, 08h
  235.     CompressByte ah, 04h
  236.     lodsw
  237.     CompressByte al, 02h
  238.     CompressByte ah, 01h
  239.     mov    [ebp], dl        ; save bit mask
  240.  
  241.     mov    ebp, edi        ; save location of mask byte
  242.     inc    edi            ; skip over mask byte
  243.     xor    dl, dl            ; zero bit mask
  244.     lodsw
  245.     CompressByte al, 80h
  246.     CompressByte ah, 40h
  247.     lodsw
  248.     CompressByte al, 20h
  249.     CompressByte ah, 10h
  250.     lodsw
  251.     CompressByte al, 08h
  252.     CompressByte ah, 04h
  253.     lodsw
  254.     CompressByte al, 02h
  255.     CompressByte ah, 01h
  256.     mov    [ebp], dl        ; save bit mask
  257.  
  258.     mov    ebp, edi        ; save location of mask byte
  259.     inc    edi            ; skip over mask byte
  260.     xor    dl, dl            ; zero bit mask
  261.     lodsw
  262.     CompressByte al, 80h
  263.     CompressByte ah, 40h
  264.     lodsw
  265.     CompressByte al, 20h
  266.     CompressByte ah, 10h
  267.     lodsw
  268.     CompressByte al, 08h
  269.     CompressByte ah, 04h
  270.     lodsw
  271.     CompressByte al, 02h
  272.     CompressByte ah, 01h
  273.     mov    [ebp], dl        ; save bit mask
  274.  
  275.     mov    ebp, edi        ; save location of mask byte
  276.     inc    edi            ; skip over mask byte
  277.     xor    dl, dl            ; zero bit mask
  278.     lodsw
  279.     CompressByte al, 80h
  280.     CompressByte ah, 40h
  281.     lodsw
  282.     CompressByte al, 20h
  283.     CompressByte ah, 10h
  284.     lodsw
  285.     CompressByte al, 08h
  286.     CompressByte ah, 04h
  287.     lodsw
  288.     CompressByte al, 02h
  289.     CompressByte ah, 01h
  290.     mov    [ebp], dl        ; save bit mask
  291.  
  292.     dec    ecx
  293.     jnz    CompressBlock        ; go for another round
  294.     
  295.     ; calculate size of output 
  296.     
  297.     pop    ebp
  298.     sub    edi, outbuf_orig
  299.     mov    eax, edi        ; return compressed length
  300. cexit:
  301.     ret
  302.  
  303. ACompress ENDP
  304.  
  305.  
  306. VXD_LOCKED_CODE_ENDS
  307.  
  308. end
  309.